home *** CD-ROM | disk | FTP | other *** search
/ Die Speccy' 97 / Die Speccy' 97.iso / amiga_system / the_aminet / comm / bbs / bbbbs85.lha / rexx / bbsEditUser.rexx < prev    next >
OS/2 REXX Batch file  |  1995-07-02  |  13KB  |  566 lines

  1. /* $VER: bbsEditUser.rexx 8.5 (1.7.95)
  2.  * Copyright ⌐ 1995 Richard Lee Stockton
  3.  * Edit userfile or conference access
  4.  * FREELY DISTRIBUTABLE
  5. */
  6.  
  7. CALL TIME('R')
  8. OPTIONS RESULTS
  9.  
  10. SIGNAL ON BREAK_C
  11. SIGNAL ON BREAK_E
  12. SIGNAL ON FAILURE
  13. SIGNAL ON SYNTAX
  14.  
  15. ARG maxtime name .
  16. IF maxtime='' THEN SAY 'Run this from within bbsMan.rexx!'
  17.  
  18. def=''
  19. pen3=''
  20. pen6=''
  21. bak2=''
  22. lineup='1B'x'M'
  23. CR=''
  24. frombb=0
  25. IF ADDRESS()='BAUD' THEN
  26.   DO
  27.     CR='0D'x
  28.     frombb=1
  29.   END
  30. changed=0
  31. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  32. CALL config()
  33. CALL loaddata()
  34. Friends.=''
  35. IF OPEN(f,bbspath'Friends/'name,'R')~=0 THEN
  36.   DO
  37.     DO i=1
  38.       Friends.i=READLN(f)
  39.       IF EOF(f) THEN LEAVE i
  40.     END
  41.     Friends.0=i
  42.     CALL CLOSE(f)
  43.   END
  44. IF colorflag=0 THEN
  45.   DO
  46.     def=''
  47.     pen3=''
  48.     pen6=''
  49.     bak2=''
  50.   END
  51. text.=''
  52. text.1='   Full Name'
  53. text.2='      Street'
  54. text.3='City, ST Zip'
  55. text.4=' Voice Phone'
  56. text.5='    Password'
  57. text.6='    Protocol'
  58. text.7='LinesPerPage'
  59. text.8=' Preferences'
  60. text.9='    Computer'
  61. text.10='   Interests'
  62. text.11='Session Time'
  63. text.12='FirstSession'
  64. text.13='Last Session'
  65. text.14='      UpLoad'
  66. text.15='    Download'
  67. text.16='   Last File'
  68. text.17='Ratio  Email'
  69. text.18='    Winnings'
  70. text.19='       Usage'
  71. text.20='       Level'
  72. text.21='Exclude DIRS'
  73. text.22='   Msgs Read'
  74. text.23='   Msgs Writ'
  75. text.24=' Marked Msgs'
  76. text.25='Marked Files'
  77. text.26='QUICKexclude'
  78. text.27=' CBV numbers'
  79.  
  80. IF level>0 THEN
  81.   IF getinput(1 1 'Change ['pen3'U'def']ser data or ['pen3'M'def']essage conference access (mU) > ')='M' THEN
  82.     DO
  83.       CALL postuser('Conference Access')
  84.       SAY CR
  85.       SAY pen3'     - Message Conference Access -'def||CR
  86.       SAY '[O]ff turns all message conferences OFF.'CR
  87.       SAY '[R]eset lets you Reset to ''x'' number of messages back.'CR
  88.       SAY 'Set the last message read by you in ALL message conferences'CR
  89.       temp=getinput(1 1 ' ['pen3'F'def']irst  ['pen3'L'def']ast  ['pen3'O'def']ff  ['pen3'R'def']eset  ['pen3'Q'def']uit  (florQ) > ')
  90.       IF POS(temp,'FLOR')=0 THEN EXIT 0
  91.       back=0
  92.       IF temp='R' THEN
  93.         back=getnumber('Set each conference pointer back how many messages?')
  94.       SAY 'Resetting...'lineup||CR
  95.       data.22=''
  96.       DO i=1 TO level
  97.         IF temp='F' THEN num=0
  98.         ELSE IF temp='O' THEN num=-1
  99.         ELSE
  100.           DO
  101.             num=countcheck('Numbers/LastMessage'i 0)-back
  102.             IF num<1 THEN num=0
  103.           END
  104.         data.22=data.22 num
  105.       END
  106.       CALL savedata()
  107.       EXIT 1
  108.     END
  109. CALL postuser('User File')
  110. new=0
  111. change=0
  112. edata.=''
  113. edname=name
  114. DO i=0 TO data.0
  115.   edata.i=data.i
  116. END
  117. num=1
  118. DO WHILE num~='' | edname~=name
  119.   IF num='' | LEFT(num,1)='Q' THEN
  120.     DO
  121.       IF change THEN
  122.         DO
  123.           CALL setdata()
  124.           CALL savedata()
  125.           change=0
  126.         END
  127.       IF new THEN
  128.         DO
  129.           data.=''
  130.           DO i=0 TO edata.0
  131.             data.i=edata.i
  132.           END
  133.           name=edname
  134.           new=0
  135.         END
  136.       CALL setdata()
  137.     END
  138.   maxnum=10
  139.   IF edata.20>sysoplevel THEN maxnum=20
  140.   IF edata.20=99 THEN maxnum=27
  141.   SAY bak2' 'name' 'def||CR
  142.   maxlines=21
  143.   IF maxnum=10 THEN maxlines=20
  144.   DO i=1 TO maxlines
  145.     IF i=5 & name~=edname & edata.20<99 THEN ITERATE
  146.     SAY RIGHT(i,2)||pen3 text.i||def':' data.i||CR
  147.   END
  148.   IF edata.20>sysoplevel THEN
  149.     DO
  150.       line=LEFT(' ',50)
  151.       IF name=edname THEN line=line'NEW = Change User.'
  152.       line=pen3||line||def||lineup
  153.       SAY line||CR
  154.     END
  155.   num=getinput(1 0 'Select Line Number To Edit: ')
  156.   IF num='NEW' & edata.20>sysoplevel & edname=name THEN    /* select a new user */
  157.     DO
  158.       new=1
  159.       IF change THEN
  160.         DO
  161.           CALL setdata()
  162.           CALL savedata()
  163.         END
  164.       change=0
  165.       nufile=bbspath'Lists/NEW_USERS'
  166.       IF OPEN(f,nufile,'R')~=0 THEN
  167.         DO i=1
  168.           SAY READLN(f)||CR
  169.           IF EOF(f) THEN LEAVE i
  170.         END
  171.       CALL CLOSE(f)
  172.       savename=name
  173.       name=getinput(1 0 'New User Name: 'def)
  174.       name=cleanstring(1':'name)
  175.       name=check_alias(name)
  176.       IF loaddata()=0 THEN
  177.         DO
  178.           SAY bbspath'USERS/'name 'failed to open!'CR
  179.           name=savename
  180.         END
  181.       ELSE IF data.20>=edata.20 THEN
  182.         DO
  183.           SAY 'Can''t Edit!' pen3||name def'has an equal or higher level than thee.'
  184.           name=savename
  185.           CALL loaddata()
  186.         END
  187.     END
  188.   ELSE IF DATATYPE(num,'W') & num>0 THEN
  189.     DO
  190.       IF num>maxnum THEN
  191.         DO
  192.           SAY CR
  193.           SAY pen3'You are not authorized to change that information!'def||CR
  194.           SAY CR
  195.         END
  196.       ELSE
  197.         DO dummy=1 TO 1
  198.           IF num=8 THEN
  199.             DO
  200.               SAY CR
  201.               SAY 'Use spaces to separate options.'CR
  202.               SAY 'If the option word is in line 8, it is ON.'CR
  203.               SAY 'Valid Options:'CR
  204.               SAY '        CLEAR  clears screen between pages.'CR
  205.               SAY '        COLOR  turns ANSI color codes ON.'CR
  206.               SAY '        MENU   combines all main commands into 1 menu.'CR
  207.               SAY '        MENUS  splits main commands into 3 menus.'CR
  208.               SAY '        PHONE  makes your phone number public.'CR
  209.               SAY '        QUICK  activates offline options. See bbsQUICK.DOC'CR
  210.               SAY '        STREET makes your street address public.'CR
  211.               SAY '        TERSE  skips some of the logon procedures.'CR
  212.               SAY CR
  213.             END
  214.           line=RIGHT(num,2)||pen3 text.num||def': '
  215.           SAY line||data.num||CR
  216.           temp=getinput(0 0 line)
  217.           IF temp='' THEN
  218.             DO
  219.               IF num=1 | num=4 | num=5 | num=6 | num=7 THEN LEAVE dummy
  220.               IF num=11 | num=12 | num=13 | num=20 THEN LEAVE dummy
  221.             END
  222.           IF num=5 | num=8 THEN temp=UPPER(temp)
  223.           IF num=20 & DATATYPE(temp,'W') & temp>=edata.20 THEN
  224.             temp=data.20
  225.           IF edata.20>sysoplevel & name~=edname THEN line2=name' '
  226.           ELSE line2=''
  227.           IF num=21 & name=edname & edata.20<99 THEN LEAVE dummy
  228.           line=text.num':' data.num pen6'CHANGED TO'def temp
  229.           CALL send2log(line2||line)
  230.           data.num=temp
  231.           SAY line||CR
  232.           SAY CR
  233.           change=1
  234.         END
  235.     END
  236. END
  237. IF change THEN
  238.   DO
  239.     CALL setdata()
  240.     CALL savedata()
  241.   END
  242. EXIT 0
  243.  
  244.  
  245. /* functions */
  246.  
  247. savedata:
  248. IF data.5='' THEN RETURN
  249. SAY 'Updating...             'lineup||CR
  250. temp=GETCLIP(name'_UPDATE')
  251. IF temp~='' THEN
  252.   DO
  253.     CALL SETCLIP(name'_UPDATE')
  254.     PARSE VAR temp upfiles' 'upbytes' 'upmail' 'upmsg
  255.     IF upfiles>0 THEN
  256.       DO
  257.         files=WORD(data.14,1)
  258.         bytes=WORD(data.14,3)
  259.         IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  260.         IF DATATYPE(bytes,'W') THEN bytes=upbytes
  261.         data.14=upfiles 'files' bytes 'bytes.' DATE()
  262.       END
  263.     IF upmail>0 THEN
  264.       DO
  265.         mail=WORD(data.17,2)
  266.         IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  267.         data.17=WORD(data.17,1) upmail WORD(data.17,3)
  268.       END
  269.     IF upmsg~='' THEN
  270.       DO
  271.         temp=data.23
  272.         DO i=1 TO level
  273.           smsg=WORD(temp,i)
  274.           IF ~DATATYPE(smsg,'W') THEN smsg=0
  275.           IF FIND(upmsg,i) THEN smsg=smsg+1
  276.           data.23=data.23 smsg
  277.         END
  278.       END
  279.   END
  280. SIGNAL OFF BREAK_E
  281. IF OPEN(f,bbspath'USERS/'name,'W')=0 THEN RETURN
  282. IF data.0<27 THEN data.0=27
  283. DO i=1 TO data.0
  284.   CALL WRITELN(f,data.i)
  285. END
  286. CALL CLOSE(f)
  287. SAY 'User' name 'has been updated.'CR
  288. RETURN
  289.  
  290.  
  291. loaddata:
  292. IF name='' THEN RETURN 0
  293. IF OPEN(f,bbspath'USERS/'name,'R')=0 THEN RETURN 0
  294. data.=''
  295. DO i=1
  296.   line=READLN(f)
  297.   IF EOF(f) THEN LEAVE i
  298.   data.i=line
  299. END
  300. data.0=i-1
  301. CALL CLOSE(f)
  302.  
  303. setdata:
  304. level=data.20
  305. password=data.5
  306. IF ~DATATYPE(data.7,'W') THEN data.7=20
  307. IF data.7<5 THEN data.7=5
  308. linesperpage=data.7
  309. IF ~frombb THEN linesperpage=20
  310. IF FIND(UPPER(data.8),'TERSE')>0 THEN terseflag=1
  311. ELSE terseflag=0
  312. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  313. ELSE colorflag=0
  314. IF FIND(UPPER(data.8),'CLEAR')>0 THEN clr='0C'x
  315. ELSE clr=''
  316. RETURN 1
  317.  
  318.  
  319. check_alias:
  320. ARG ali .
  321. IF ~DATATYPE(Friends.0,'W') THEN RETURN ali
  322. DO ii=1 TO Friends.0
  323.   IF UPPER(WORD(Friends.ii,1))=ali THEN RETURN WORD(Friends.ii,2)
  324. END
  325. RETURN ali
  326.  
  327.  
  328. postuser:
  329. IF ~frombb | ~SHOW('P','BBSPOST') THEN RETURN
  330. PARSE ARG parg 
  331. ptext=GETCLIP('BBSPOST4')
  332. IF WORDS(ptext)>4 THEN ptext=LEFT(ptext,WORDINDEX(ptext,5)-1)
  333. ptext=STRIP(ptext)
  334. ptext=CENTER(ptext'   bbsEditUser:' parg,74)
  335. CALL SETCLIP('BBSPOST4',ptext)
  336. ADDRESS BBSPOST 'UPDATE'
  337. RETURN
  338.  
  339.  
  340. waiting:
  341. CALL checktime()
  342. IF waitchar='Q' THEN
  343.   DO
  344.     waitchar=''
  345.     RETURN
  346.   END
  347. waitchar=''
  348. IF nonstop=1 THEN RETURN
  349. OPTIONS PROMPT pen3'                       RETURN=Continue  'def
  350. PULL waitchar
  351. RETURN
  352.  
  353.  
  354. waiting2:
  355. CALL checktime()
  356. IF nonstop=1 THEN RETURN 0
  357. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  358. IF waitchar='N' THEN
  359.   DO
  360.     nonstop=1
  361.     SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def||CR
  362.     SAY CR
  363.     CALL DELAY(100)
  364.     waitchar=''
  365.   END
  366. IF waitchar='Q' THEN RETURN 1
  367. RETURN 0
  368.  
  369.  
  370. cleanstring:
  371. PARSE ARG nflag':'cstr
  372. IF nflag=1 THEN
  373.   DO
  374.     cstr=COMPRESS(cstr,"'`")
  375.     cstr=TRANSLATE(cstr,,namemask)
  376.     cstr=SPACE(cstr,1,'_')
  377.     RETURN cstr
  378.   END
  379. bot=XRANGE(,'1F'x)
  380. IF nflag=2 THEN bot=COMPRESS(bot,'1B'x)
  381. ELSE cstr=strip_ansi(cstr)
  382. top=XRANGE('7F'x)
  383. cstr=COMPRESS(cstr,bot||top)
  384. IF nflag=0 THEN cstr=STRIP(cstr)
  385. RETURN cstr
  386.  
  387.  
  388. strip_ansi:
  389. PARSE ARG aline 
  390. n=POS('1B'x,aline)
  391. DO WHILE n>0
  392.   DO k=2
  393.     IF DATATYPE(SUBSTR(aline,n+k,1),'M') | (n+k+1)>LENGTH(aline) THEN
  394.       leave k
  395.   END
  396.   aline=DELSTR(aline,n,k+1)
  397.   n=POS('1B'x,aline)
  398. END
  399. RETURN aline
  400.  
  401.  
  402. countcheck:
  403. PARSE ARG fname' 'cknum .
  404. fname=bbspath||fname
  405. IF ~EXISTS(fname) THEN
  406.   DO
  407.     IF cknum=0 THEN RETURN 0
  408.     IF OPEN(f,fname,'W')=0 THEN RETURN 0
  409.     CALL WRITELN(f,cknum)
  410.     CALL CLOSE(f)
  411.     RETURN cknum
  412.   END
  413. IF OPEN(f,fname,'R')=0 THEN
  414.   DO
  415.     CALL DELAY(99)
  416.     IF OPEN(f,fname,'R')=0 THEN RETURN cknum
  417.   END
  418. retval=STRIP(READLN(f))
  419. CALL CLOSE(f)
  420. IF ~DATATYPE(retval,'W') THEN retval=0
  421. IF ~DATATYPE(cknum,'W') THEN cknum=0
  422. IF retval<cknum THEN
  423.   DO
  424.     IF OPEN(f,fname,'W')~=0 THEN
  425.       DO
  426.         CALL WRITELN(f,cknum)
  427.         CALL CLOSE(f)
  428.         RETURN cknum
  429.       END
  430.   END
  431. RETURN retval
  432.  
  433.  
  434. getinput:
  435. PARSE ARG upflag' 'oneflag' 'pline
  436. CALL checktime()
  437. OPTIONS PROMPT pline
  438. PARSE PULL inarg
  439. inarg=STRIP(inarg)
  440. IF upflag THEN inarg=UPPER(inarg)
  441. IF oneflag THEN inarg=LEFT(inarg,1)
  442. RETURN inarg
  443.  
  444.  
  445. getnumber:
  446. PARSE ARG tprompt
  447. tnum=getinput(1 0 '  'tprompt' > ')
  448. mask=COMPRESS(XRANGE(),'0123456789')
  449. tnum=COMPRESS(tnum,mask)
  450. IF ~DATATYPE(tnum,'W') THEN tnum=0
  451. tnum=tnum%1
  452. IF tnum>0 & tnum<10 THEN tnum='0'tnum
  453. RETURN tnum
  454.  
  455.  
  456. checktime:
  457. IF ~frombb THEN RETURN
  458. IF TIME('E')>maxtime THEN EXIT 0
  459. IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
  460. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  461. CALL checkdcd()
  462. RETURN
  463.  
  464.  
  465. checkdcd:
  466. IF ~frombb THEN RETURN
  467. dcd
  468. IF RC=0 THEN
  469.   DO
  470.     DO dcds=1 TO 3  /* 5 second delay */
  471.       CALL DELAY(50)
  472.       dcd
  473.       IF RC~=0 THEN RETURN
  474.     END
  475.     dcd
  476.     IF RC=0 THEN EXIT 0
  477.   END
  478. xmsg=GETCLIP('BBS_MESSAGE')
  479. IF xmsg~='' THEN
  480.   DO
  481.     SAY CR
  482.     SAY bak2' Message From BBBBS: 'def||CR
  483.     SAY xmsg||CR
  484.     SAY CR
  485.     CALL SETCLIP('BBS_MESSAGE')
  486.     CALL waiting()
  487.   END
  488. IF POS('G',GETCLIP('BBS_COMMAND'))>0 THEN EXIT
  489. RETURN
  490.  
  491.  
  492. config:
  493. arg='s:CONFIG.BBS'
  494. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  495. IF OPEN(f,arg,'R')=0 THEN
  496.   DO
  497.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'CR
  498.     EXIT 20
  499.   END
  500. lynes.=''
  501. DO i=1
  502.   line=READLN(f)
  503.   IF EOF(f) THEN LEAVE i
  504.   lynes.i=line
  505. END
  506. CALL CLOSE(f)
  507. compos=POS('/*',lynes.1)
  508. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  509. bbsname=STRIP(lynes.1)
  510. sysop=WORD(lynes.2,1)
  511. sysoplevel=WORD(lynes.5,1)
  512. bbspath=WORD(lynes.6,1)
  513. IF ~EXISTS(bbspath) THEN
  514.   DO
  515.     SAY bbspath 'does not exist!'CR
  516.     EXIT 1
  517.   END
  518. testchar=RIGHT(bbspath,1)
  519. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  520. RETURN
  521.  
  522.  
  523. send2log:
  524. PARSE ARG sendline
  525. IF ~frombb THEN RETURN
  526. logfile=bbspath'Logs/log.'DATE('S')
  527. fl='W'
  528. IF EXISTS(logfile) THEN fl='A'
  529. IF ~OPEN('log',logfile,fl) THEN
  530.   DO
  531.     IF ~OPEN('log',logfile,fl) THEN
  532.       DO
  533.         SAY 'failed to open log file'
  534.         RETURN
  535.      END
  536.   END
  537. CALL WRITELN('log','bbsEditUser:' sendline)
  538. CALL CLOSE('log')
  539. RETURN
  540.  
  541.  
  542. BREAK_E:
  543. i=999999
  544. ri=999999
  545. wi=999999
  546. RETURN
  547.  
  548.  
  549. BREAK_C:
  550. EXIT 1
  551.  
  552.  
  553. FAILURE:
  554. SYNTAX:
  555. lin.1=''ERRORTEXT(RC)''
  556. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  557. lin.3=SIGL ''SOURCELINE(SIGL)''
  558. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  559. DO er=1 TO 4
  560.   IF level>sysoplevel | ~frombb THEN SAY 'bbsEditUser:' lin.er||CR
  561.   IF frombb THEN CALL send2log(lin.er)
  562. END
  563. EXIT 1
  564.  
  565. /* bbsEditUser.rexx */
  566.